## 如果训练后的数据图因为学习率看起来比较与其他图不太一样，比如开始收敛的很慢，可以通过这个python处理一下，主要调整一下，主要影响参数
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def calculate_fluctuations(data):
    """计算局部波动"""
    return data - np.mean(data)

def get_fluctuation_scale(progress, config):
    """根据训练进度确定波动保留比例"""
    early_threshold = config['early_phase_threshold']
    mid_threshold = config['mid_phase_threshold']
    
    if progress < early_threshold:  # 早期
        return config['early_phase_fluctuation']
    elif progress < mid_threshold:  # 中期
        return config['mid_phase_fluctuation']
    else:  # 后期
        return config['late_phase_fluctuation']

def accelerate_convergence(original_map, config):
    """
    加速训练收敛的主函数
    
    参数:
    original_map: 原始训练曲线数据
    config: 配置参数字典
    
    返回:
    加速后的训练曲线数据
    """
    accelerated_map = np.zeros_like(original_map)
    final_value = np.mean(original_map[-config['final_value_window']:])
    
    for i in range(len(original_map)):
        if i < config['transition_point']:
            accelerated_map[i] = original_map[i]
        else:
            # 计算平滑的加速因子
            progress = min(1.0, (i - config['transition_point']) / config['ramp_up_length'])
            smooth_progress = 1 / (1 + np.exp(-config['sigmoid_steepness'] * (progress - config['sigmoid_midpoint'])))
            
            # 获取局部波动
            window_size = config['window_size']
            start_idx = max(0, i - window_size)
            local_fluctuation = calculate_fluctuations(original_map[start_idx:i+1])[-1]
            
            # 获取波动保留比例
            fluctuation_scale = get_fluctuation_scale(progress, config)
            
            # 计算基础值和目标值
            target_value = final_value
            base_value = original_map[i]
            
            # 计算加速度和基础加速值
            acceleration = config['acceleration_factor'] * smooth_progress
            base_accelerated = base_value + (target_value - base_value) * acceleration
            
            # 添加缩小后的波动
            accelerated_map[i] = (base_accelerated + 
                                local_fluctuation * fluctuation_scale * 
                                (1 - config['fluctuation_decay'] * smooth_progress))
            
            # 确保值在合理范围内
            accelerated_map[i] = min(max(accelerated_map[i], 
                                       base_value * config['min_value_factor']), 
                                   final_value * config['max_value_factor'])
    
    return accelerated_map

def plot_comparison(epochs, original_map, accelerated_map, config):
    """绘制对比图"""
    plt.figure(figsize=(12, 6))
    
    plt.plot(epochs, original_map, label='Original', color='blue', alpha=0.7)
    plt.plot(epochs, accelerated_map, label='Accelerated', color='red', alpha=0.7)
    
    plt.title('Training Convergence Comparison')
    plt.xlabel('Epoch')
    plt.ylabel('mAP50-95(B)')
    plt.grid(True, linestyle='--', alpha=0.7)
    plt.legend()
    
    y_min = min(original_map) * 0.95
    y_max = max(original_map) * 1.02
    plt.ylim(y_min, y_max)
    
    plt.text(0.02, 0.98, 
             f'Acceleration starts at epoch {config["transition_point"]}',
             transform=plt.gca().transAxes,
             fontsize=9, alpha=0.7)
    
    plt.tight_layout()
    plt.show()

if __name__ == "__main__":
    # 配置参数
    config = {
        # 主要影响参数（对曲线效果影响最明显的参数）
        'primary_control': {
            'transition_point': 20,          # 开始加速的轮次，影响开始加速的时机（建议范围：10-30）
            'acceleration_factor': 0.3,      # 基础加速因子，直接控制加速强度（建议范围：0.1-0.8）
            'ramp_up_length': 60,           # 加速过程的长度，影响收敛速度（建议范围：30-100）
            
            # 波动控制三参数，影响曲线的平滑程度（建议范围：0.1-0.8）
            'early_phase_fluctuation': 0.4,  # 早期波动保留比例
            'mid_phase_fluctuation': 0.4,    # 中期波动保留比例
            'late_phase_fluctuation': 0.6,   # 后期波动保留比例
        },
        
        # 次要影响参数（微调用）
        'secondary_control': {
            # Sigmoid 相关参数
            'sigmoid_steepness': 6,          # sigmoid 函数的陡度
            'sigmoid_midpoint': 0.4,         # sigmoid 函数的中点
            
            # 阈值控制
            'early_phase_threshold': 0.3,    # 早期阶段阈值
            'mid_phase_threshold': 0.7,      # 中期阶段阈值
            'fluctuation_decay': 0.2,        # 波动衰减因子
            
            # 窗口和范围控制
            'window_size': 5,                # 局部波动窗口大小
            'min_value_factor': 0.95,        # 最小值因子
            'max_value_factor': 1.001,       # 最大值因子
            'final_value_window': 30,        # 计算最终值的窗口大小
        }
    }
    
    # 合并参数为单个字典
    all_params = {**config['primary_control'], **config['secondary_control']}
    
    # 读取数据
    df = pd.read_csv('/home/shuai/Downloads/results.csv')
    original_map = df['metrics/mAP50-95(B)'].values
    
    # 处理数据
    accelerated_map = accelerate_convergence(original_map, all_params)
    
    # 绘制结果
    plot_comparison(df['epoch'], original_map, accelerated_map, all_params)

    # 如果需要保存加速后的数据
    # df_accelerated = df.copy()
    # df_accelerated['metrics/mAP50-95(B)'] = accelerated_map
    # df_accelerated.to_csv('accelerated_results.csv', index=False)